package com.xixibaby.core.message;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * 简单通道
 * 异步
 * 发送时间
 * 基础时间  基础时间 + 偏移时间 = 发送时间
 * 偏移时间
 * 动态发送目标能力
 */
public interface Channel<T extends ExeObj> extends Serializable {

    /**
     * 标志
     * @return
     */
    Integer code();

    /**
     * 获取到指定的目标key
     * @return
     */
    String target();

    /**
     * 获取动态目标
     * @return
     */
    TargetFunction daymicTarget();

    /**
     * 是否是采用动态目标策略
     * @return
     */
    boolean isDaymic();

    /**
     * 动态获取发送目标
     * @return
     * @param function
     */
    Channel<ExeObj> target(TargetFunction function);

    /**
     * 指定发送目标为参数map中的哪个字段
     * @param filed
     * @return
     */
    Channel<T> target(String filed);

    /**
     * 指定消息内容的format方式
     * @param strings
     * @return
     */
    Channel<T> format(String[] strings);

    /**
     * 执行器
     * @param target
     * @param context
     * @return
     */
    List<Boolean> handler(String[] target, Map<String, Object> context);

    /**
     * 基于指定的基础时间延时
     * @param date 指定时间
     * @param seconds 延时秒数
     */
    Channel<T> delay(Date date, Integer seconds);

    /**
     * 基于指定的基础时间延时
     * @param date 字符串类型的时间
     * @param seconds 延时秒数
     * @return
     */
    Channel<T> delay(String date, Integer seconds);

    /**
     * 修改延时的基础时间
     * @param date 时间
     * @return
     */
    Channel<T> delay(Date date);
    /**
     * 修改延时的基础时间
     * @param date 字符串类型的时间
     * @return
     */
    Channel<T> delay(String date);

    /**
     * 基于当前时间 延时执行
     * @param seconds 延时秒数
     */
    Channel<T> delay(Integer seconds);

    /**
     * 是否异步执行
     * @param aysn
     * @return
     */
    Channel<T> aysn(boolean aysn);

    /**
     * 指定发送时间
     * @param date 具体发送时间
     */
    Channel<T> sendDate(Date date);

    /**
     * 获取定时发送的时间
     * @return 具体发送时间
     */
    Date sendDate();

    /**
     * 获取定时延时信息
     * @return 延时信息
     */
    Delay delay();

    /**
     * 相对于当前时间延时的秒数
     * @return
     */
    Integer seconds();


    /**
     * 定时延时的时间
     * @return
     */
    Date date();

    /**
     * 获取通道是否异步执行
     * @return
     */
    boolean aysn();

    String id();
}
